package com.seeyon.apps.ext.ObxMsgPush.eventlisteners;

import java.net.URLEncoder;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.log4j.Logger;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.apps.ext.ObxMsgPush.service.AppService;
import com.seeyon.apps.ext.ObxMsgPush.utils.HttpUtil;
import com.seeyon.apps.ext.ObxMsgPush.utils.MyUtils;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.authenticate.domain.User;
import com.seeyon.ctp.common.usermessage.pipeline.Message;
import com.seeyon.ctp.common.usermessage.pipeline.MessagePipeline;
import com.seeyon.ctp.util.Strings;
import com.seeyon.ctp.util.json.JSONUtil;


/**
 * 消息通道
 */
public class ObxPushOtherMessage implements MessagePipeline {

    /**
     * 日志服务
     */
    private static final Logger log = Logger.getLogger(ObxPushOtherMessage.class);

    /**
     * 得到哪些应用类别可以配置(参考 ApplicationCategoryEnum), 如果采用系统默认， 请直接返回 null 如果不允许配置请参考 isAllowSetting(User currentUser)
     */
    @Override
    public List<Integer> getAllowSettingCategory(User arg0) {
        return null;
    }

    /**
     * 消息展现通道的系统标示，
     * 注意不要重复，有数字字母 下划线构成，如：pc,sms,email,rtx,gke getShowName()
     * string 消息展现通道的显示名称 isAvailability() boolean 该通道是否可用，可以控制是否需要消息展现
     */
    @Override
    public String getName() {
        return "慧集通待办集成通道";
    }

    /**
     * 显示名称
     */
    @Override
    public String getShowName() {
        return "慧集通待办集成通道";
    }

    /**
     * 在此方法中处理消息，把消息集成到外系统 getSortId() int 排序号，从 0 开始
     */
    @Override
    public int getSortId() {
        return 0;
    }

    /**
     * 是否允许用户在“个人设置-消息提示设置”中进行配 置； 如：短信提示，需要后台管理员授权，并且设置了个人 的手机号码，人员是当前登录者，允许配置返回 null， 否则返回提示信息（注意国际化）
     */
    @Override
    public String isAllowSetting(User arg0) {
        return null;
    }

    /**
     * 该通道是否可用，可以控制是否需要消息展现
     */
    @Override
    public boolean isAvailability() {
        return true;
    }

    /**
     * 默认是否发送，如果为 false，则个人需要在“个人设 置-消息提示设置”中进行配置
     */
    @Override
    public boolean isDefaultSend() {
        return true;
    }

    /**
     * 如果 isDefaultSend 设置为false,则个人需要设置为    true
     */
    @Override
    public boolean isShowSetting() {
        return true;
    }

    /**
     * 在此方法中处理消息，把消息集成到外系统 getSortId() int 排序号，从 0 开始  参考:WeixinMessagePipeline
     */
    @Override
    public void invoke(Message[] messages) {

        //消息列表切割为1000条一份的集合
        List<Message>[] splitList = Strings.splitList(Arrays.asList(messages), 1000);
        //循环处理已经切割好的集合
        for (List<Message> list : splitList) {
            //处理每一条消息
            for (Message message : list) {
                String linkType = message.getLinkType();
                Long referenceId = message.getReferenceId();
                Long memberId = message.getReceiverMember().getId();
                String loginName = message.getReceiverMember().getLoginName();

                try {
                    String str = MyUtils.getMessageJson(message, "link");
                    Map map = null;
                    map = (Map) JSONUtil.parseJSONString(str, Map.class);
                    if (map != null) {
                        String link = (String) map.get("U");//移动端地址
                        String senderId = (String) map.get("S");//发起人
                        String sendDate = (String) map.get("D");//发送时间
                        String content = (String) map.get("C");//标题
                        String ticket = (String) map.get("T");//ticket
                        String openId = (String) map.get("O");//openId
                        String pclink = (String) map.get("P");//openId
//						String OAip = "http://183.65.43.11:94";
//						String OAip = (String) map.get("I");
                        if (Strings.isNotBlank(link)) {
                            String accessToken = appService.getToken();
                            log.info("accessToken:" + accessToken);
//							log.info("=======link:"+link);
//							log.info("=======pclink:"+pclink);
//							log.info("=======senderId:"+senderId);
//							log.info("=======openId:"+openId);
//							log.info("=======sendDate:"+sendDate);
//							log.info("=======content:"+content);
//							log.info("=======ticket:"+ticket);
//							log.info("=======OAip:"+OAip);
                            Long id1 = Long.valueOf(message.getLinkParams()[0]);
                            int category = message.getCategory();
                            link = URLEncoder.encode(link, "UTF-8");
                            log.info("link:" + link);
                            String h5Url = WWIP + "/seeyon/JdMessage.do?method=openLinkPage&ticket=" + ticket + "&loginName=" + loginName + "&link=" + link + "&id=" + referenceId + "&id1=" + id1
                                    + "&category=" + category + "&linkType=" + linkType;
                            log.info(h5Url);
                            log.info("h5Url:" + h5Url);
                            JSONObject jsonObject = new JSONObject();
                            JSONArray params = new JSONArray();
                            JSONObject openIds = new JSONObject();
                            openIds.put("openId", openId);//接收人***
                            params.add(openIds);
                            jsonObject.put("params", params);
                            jsonObject.put("appId", APPID);//第三方应用ID***
                            jsonObject.put("sourceId", UUID.randomUUID().getMostSignificantBits());//其值都第三方服务自行设定，需保证其唯一性***
                            jsonObject.put("sync", true);//true表示同步，false表示异步，默认为false ( 建议使用 sync=true 的方式 )
                            jsonObject.put("todoType", 0);//待办显示目的地，目前可选为 0(通知中心) 或 1(待审批)
                            jsonObject.put("url", h5Url);//点击待办跳转的URL***
                            jsonObject.put("content", content);//待办内容***
                            jsonObject.put("title", "OA推送信息");//标题***
                            jsonObject.put("itemtitle", "");//待办项标题内容显示,选填，如不填，则默认为title值
                            jsonObject.put("headImg", "https://yunzhijia.com/cloudflow/static/icon/sp-default3.svg");//待办在客户端显示的图URL***
                            jsonObject.put("senderId", senderId);//待办的发送人的openId
                            log.info("入参：" + jsonObject.toString());
                            Map<String, Object> header = new HashMap<String, Object>();
                            header.put("Content-Type", "application/json");
                            String url = "https://yunzhijia.com/gateway/newtodo/open/generatetodo.json?accessToken=" + accessToken;
                            String sendByHttp = HttpUtil.sendByHttp(url, header, jsonObject.toString());
                            log.info("回参：" + sendByHttp);
                        }
                    }
                } catch (Exception e) {
                    log.error("", e);
                }

            }
        }
    }

}